package com.shujia.jichu

import scala.io.Source

object Demo19WordCount {
  def main(args: Array[String]): Unit = {
    /**
     * 使用scala语言实现单词统计 scala/data/words.txt
     */
    //读取数据文件
    //链式调用
    val lines: List[String] = Source.fromFile("scala/data/words.txt").getLines().toList

    //flatMap 将每一行数据扁平化
    val words: List[String] = lines.flatMap((line: String) => line.split("\\|"))

    //按照相同的单词进行分组
    val wordsKV: Map[String, List[String]] = words.groupBy((word: String) => word)

    //将相同的单词组成的集合，求个数
    val wordCount: Map[String, Int] = wordsKV.map((kv: (String, List[String])) => {
      val word: String = kv._1 // "world"
      val counts: Int = kv._2.size // "List(world, world)"
      (word, counts)
    })

    //遍历结果
//    wordCount.foreach((kv: (String, Int)) => println(s"单词:${kv._1}, 个数:${kv._2}"))
    wordCount.foreach(println)
    println("=" * 100)

    /**
     * 简写的链式调用
     *
     * spark的代码编写都是这种的写法
     */
    Source
      .fromFile("scala/data/words.txt") // 读取文件内容
      .getLines() // 获取文件中所有行数据
      .toList // 将行数据转成List集合
      .flatMap(_.split("\\|")) // 扁平化
      .groupBy((w:String) => w) // 相同的单词进行分组
      .map((kv:(String,List[String])) => (kv._1, kv._2.size)) // 计算每个分组中的单词个数
      .foreach(println) // 输出

    //随堂练习：
    //1、求每个班级的人数
    //2、求每个学生的总分


  }
}
